let obj = {
  a: 1,
  b: 2,
  c: 3,
};

function getValues(obj: any, keys: string[]) {
  return keys.map((key) => obj[key]);
}

console.log(getValues(obj, ["a", "b"]));

// keyof T

interface Obj {
  a: number;
  b: string;
}
// keyof
let key: keyof Obj;
// T[K]
let value: Obj["a"];

// T extends U
// 我们先定义一个泛型变量 T 用它来约束 obj 然后呢在定义一个泛型变量 K 用它来约束 keys 数组，
// 然后我们把 K 增加一个类型约束让它呢继承 obj 所有属性的联合类型，
// 然后函数的返回值呢 首先它是一个数组，数组的元素的类型呢就是属性 K 对应的类型
function getValues1<T, K extends keyof T>(obj: T, keys: K[]): T[K][] {
  return keys.map((key) => obj[key]);
}
console.log(getValues1(obj, ["a", "b"]));
console.log(getValues1(obj, ["e", "f"]));

export {};
